﻿// owner 蒋家伟
#include "UniqueIdUnitTest.h"

#include "UnitTestDataDefine.h"
#include "StringUtils.h"
#include "UnitTestUtils.h"
#include "Dbg_Warn_Define.h"

using namespace std;
using namespace jsdk;

UNIT_TEST_START(jsdk, UniqueIdUnitTest)
{
    UniqueIdUnitTest test;

    bool success = test.testCommonTest();
    DBG_WARN_AND_RETURN_FALSE_UNLESS(success, L"UniqueId常规测试失败", L"蒋家伟", L"2023-11-09");

    success = test.testFromStringAndToString();
    DBG_WARN_AND_RETURN_FALSE_UNLESS(success, L"UniqueId与字符串相互转换失败", L"蒋家伟", L"2023-11-09");

    success = test.testUnique();
    DBG_WARN_AND_RETURN_FALSE_UNLESS(success, L"UniqueId唯一性", L"蒋家伟", L"2023-11-09");

    return true;
}

bool jsdk::UniqueIdUnitTest::testFromStringAndToString() const
{
    for (int i = 0; i < 10'000; i++)
    {
        UniqueId validUid = UniqueId::create();
        DBG_WARN_AND_RETURN_FALSE_UNLESS(validUid.isValid(), L"创建的对象应该有效", L"蒋家伟", L"2023-11-19");
        std::wstring str = validUid.toString();
        DBG_WARN_AND_RETURN_FALSE_UNLESS(!str.empty(), L"有效的uid转换成字符串失败", L"蒋家伟", L"2023-11-19");
        UniqueId validUid2 = UniqueId::fromWString(str);
        DBG_WARN_AND_RETURN_FALSE_UNLESS(validUid2.isValid(), L"从字符串转换到uid失败，字符串 : " + str, L"蒋家伟", L"2023-11-19");
        DBG_WARN_AND_RETURN_FALSE_UNLESS(validUid == validUid2, L"从validUid导出的字符串再转换回去应该相同", L"蒋家伟", L"2023-11-09");
    }
    return true;
}

bool jsdk::UniqueIdUnitTest::testCommonTest() const
{
    UniqueId defaultvalue;
    DBG_WARN_AND_RETURN_FALSE_UNLESS(!defaultvalue.isValid(), L"默认对象应该无效", L"蒋家伟", L"2023-11-19");

    UniqueId validUid = UniqueId::create();
    DBG_WARN_AND_RETURN_FALSE_UNLESS(validUid.isValid(), L"创建的对象应该有效", L"蒋家伟", L"2023-11-19");

    UniqueId copyStruct = validUid;
    DBG_WARN_AND_RETURN_FALSE_UNLESS(copyStruct.isValid() && copyStruct == validUid, L"拷贝构造对象应该有效", L"蒋家伟", L"2023-11-19");

    defaultvalue = validUid;
    DBG_WARN_AND_RETURN_FALSE_UNLESS(defaultvalue.isValid() && defaultvalue == validUid, L"拷贝赋值对象应该有效且与目标相等", L"蒋家伟", L"2023-11-19");

    return true;
}

bool jsdk::UniqueIdUnitTest::testUnique() const
{
    // 测试1w次，查看是否有重复
    std::set<UniqueId> uidSet;
    for (int i = 0; i < 10'000; i++)
    {
        UniqueId uid = UniqueId::create();
        DBG_WARN_AND_RETURN_FALSE_UNLESS(uidSet.insert(uid).second, L"存在重复的uid : " + uid.toString(), L"蒋家伟", L"2023-11-09");
    }
    return true;
}

jsdk::UniqueIdUnitTest::UniqueIdUnitTest()
{
}
